package Vista;

import java.awt.Color;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JMenuBar;
import javax.swing.JPanel;

import juego.Juego;
import Controlador.Controlador;
import Controlador.Ganaste;
import Controlador.Perdiste;

public class Vista extends JFrame implements Observer {
	
	Juego juego;
	
	VistaMenu vistaMenu;
	VistaJuego vistaJuego;
	VistaInfo vistaInfo;	
	
	int dimension;
	int anchoVentana, altoVentana;
	int anchoJuego, anchoCalle;	
	int vehiculoX, vehiculoY;
	int llegadaX, llegadaY;	
	
	JLayeredPane capas;
	JPanel plano, info, obstaculos, llegada, vehiculo;
	PanelCircular circulo;	
	JMenuBar menu;

    //Constructor Vista
	public Vista(Controlador controlador, Juego juego) {		
		this.juego = juego;
		this.juego.addObserver(this);						
		dimension = this.juego.getMapa().getDimension();
		anchoCalle = 17; //minimo
		while(anchoCalle * dimension < 625) { 
			anchoCalle += 2;
		}	
		anchoJuego =  anchoCalle * dimension;		
		anchoVentana = anchoJuego + 200;		
		altoVentana = anchoJuego + 50;		
		vistaJuego = new VistaJuego(juego);
		vistaMenu = new VistaMenu(this);
		vistaInfo = new VistaInfo(juego);
		addKeyListener(controlador.getKeyListener());
		setTitle("Juego GPS CHALLENGE");
		getContentPane().setBackground(Color.white);			
		setSize(anchoVentana, altoVentana);
		setResizable(false);
		setLocationRelativeTo(null);
		dibujarVista();
		setVisible(true);		
	}
	
	public void dibujarVista() {
		
		//menu
		menu = vistaMenu.dibujarMenu();
		this.setJMenuBar(menu);
		
		//estructura de capas
		capas = new JLayeredPane();
		
        //capa(0): Panel con plano de calles y manzanas
		plano = vistaJuego.dibujarPlano();
        capas.add(plano, new Integer(0));
        
        //capa(0): Panel con informacion y referencias
        info = vistaInfo.dibujarInfo(juego);
        capas.add(info, new Integer(0));
        
        //capa(1): Panel con obstaculos y sorpresas
        obstaculos = vistaJuego.dibujarObjetosDeMapa(juego);
        capas.add(obstaculos, new Integer(1));
        
        //capa(2): PanelCircular con centro transparente
        circulo = vistaJuego.dibujarCirculo(juego);
        capas.add(circulo, new Integer(2));
        
        //capa(3): Panel con llegada
        llegada = vistaJuego.dibujarLlegada();
        capas.add(llegada, new Integer(3)); 
        
        //capa(4): Panel con vehiculo
        vehiculo = vistaJuego.dibujarVehiculo(juego);
        capas.add(vehiculo, new Integer(4));        

        //se agregan las capas al Frame
        this.add(capas);                  
	}
	
	public void update(Observable observable, Object arg1) {
		
        capas.remove(obstaculos);
        obstaculos = vistaJuego.dibujarObjetosDeMapa(juego);
        capas.add(obstaculos, new Integer(1));
        
        capas.remove(vehiculo);
        vehiculo = vistaJuego.dibujarVehiculo(juego);
        capas.add(vehiculo, new Integer(4));
        
        capas.remove(circulo);
        circulo = vistaJuego.dibujarCirculo(juego);
        capas.add(circulo, new Integer(2));
        
        capas.remove(info);
        info = vistaInfo.dibujarInfo(juego);
        capas.add(info, new Integer(0));
        
        if(!juego.seEstaJugando()) {
        	capas.remove(circulo);
        	Ganaste ganaste = new Ganaste(juego, this);
        } else if(juego.getVehiculo().movimientos() > juego.getLimite()) {
        	capas.remove(circulo);
        	Perdiste perdiste= new Perdiste(juego, this);
        }
	}
}


